package com.upcode.weighing.util.ops;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;

public class MoneyUtils {

    private static final  Integer TAX_PRICE_CONSTANT = 1;
    public static final  String  Lock_Flag="0";//锁定标识
    public static final  String No_Lock_Flag="1";//未锁定标识


    //计算税额
    public static BigDecimal getSe(BigDecimal sl,BigDecimal payAmount){
        //税额=税率*金额
        BigDecimal se=sl.multiply(payAmount);
        return se;
    }

    //将从数据库中获取的金额(分)转为圆，保留到小数点后两后
    public static BigDecimal getMoney(BigDecimal dataMoney){
        BigDecimal b1=new BigDecimal(dataMoney.toString());
        BigDecimal b2=b1.divide(new BigDecimal(100),2,BigDecimal.ROUND_HALF_UP);
        return b2;
    }

    /**
     * 获取不含税金额
     * @param dataMoney  支付金额
     * @param sl  税率
     * @return
     */
    public static BigDecimal getTaxPrice(BigDecimal dataMoney,BigDecimal sl,Integer digit){
        BigDecimal taxRate = (new BigDecimal(TAX_PRICE_CONSTANT).add(sl)).setScale(digit,BigDecimal.ROUND_HALF_UP);
        // 不含税金额
        BigDecimal taxPriceAmount = dataMoney.divide(taxRate, digit, RoundingMode.HALF_UP);
        return taxPriceAmount;
    }

    /**
     * 获取税额 计算公式
     * @param dataMoney  支付金额
     * @param sl  税率
     * @return
     */
    public static BigDecimal getPrice(BigDecimal dataMoney,BigDecimal sl){
        BigDecimal amount = (dataMoney.divide((new BigDecimal(TAX_PRICE_CONSTANT).add(sl)),6, RoundingMode.HALF_UP)).multiply(sl);
        return amount.setScale(6,BigDecimal.ROUND_HALF_UP);
    }


    /**
     * 获取单价
     * @param dataMoney  支付金额
     * @param sl  税率
     * @return
     */
    public static BigDecimal getTaxUnitPrice(BigDecimal dataMoney,BigDecimal sl){
        // 1.09
        BigDecimal taxRate = (new BigDecimal(TAX_PRICE_CONSTANT).add(sl)).setScale(6,BigDecimal.ROUND_HALF_UP);
        // 不含税金额
        BigDecimal taxPriceAmount = dataMoney.divide(taxRate, 11, RoundingMode.HALF_UP);
        return taxPriceAmount;
    }

    /**
     * 获取不含税金额
     * @param dataMoney  不含税金额
     * @param sl  税率
     * @return
     */
    public static BigDecimal getTaxRatePrice(BigDecimal dataMoney,BigDecimal sl){
        // 税金额
        BigDecimal taxPriceAmount = dataMoney.multiply(sl).setScale(2,BigDecimal.ROUND_HALF_UP);
        return taxPriceAmount;
    }

    /**
     * 计算合计金额
     * @param sl
     * @param jshj
     * @return
     */
    public static BigDecimal getHJJE(BigDecimal sl,BigDecimal jshj){
        //金额=合计金额/(1+税率)
        //税率
        BigDecimal s1=new BigDecimal(sl.toString());
        //1+税率
        BigDecimal s2=s1.add(new BigDecimal(1));
        //金额/合计金额
        BigDecimal s3=jshj.divide(s2,2, BigDecimal.ROUND_HALF_UP);
        return s3;
    }
    /**
     * 计算发票税额
     * @param jshj 价税合计
     * @param hjje 合计金额
     * @return
     */
    public static BigDecimal getHJSE(BigDecimal jshj,BigDecimal hjje){

        return jshj.subtract(hjje);
    }
    /**
     * 字符串转为分
     * @param str
     * @return
     */
    public static Integer toFen(String str){
        BigDecimal b = new BigDecimal(str).multiply(new BigDecimal(100));
        return b.intValue();
    }

    /**
     * 分转为元
     * @param str
     * @return
     */
    public static String toYuan(String str){
        BigDecimal b=new BigDecimal(str).divide(new BigDecimal("100"));
        return b.toString();
    }

    /**
     * 数字转为百分比
     * @param num1 根据条件查询出来的数量
     * @param num2 总数
     * @return
     */
    public static String toBl(Integer num1,Integer num2){
        if(num1 == 0 || num2 == 0){
            return "0.00%";
        }
        BigDecimal a=new BigDecimal(num2.toString());
        BigDecimal b=new BigDecimal(num1.toString());
        BigDecimal middleNum = b.multiply(new BigDecimal(100));
        BigDecimal result = middleNum.divide(a,2,BigDecimal.ROUND_HALF_UP);
        return new StringBuilder().append(result).append("%").toString();
    }
    /**
     * 数字转为百分比
     * @param num1 根据条件查询出来的数量
     * @param num2 总数
     * @return
     */
    public static String toBl(BigDecimal num1,BigDecimal num2){
        if(num1.compareTo(BigDecimal.ZERO)==0 || num2.compareTo(BigDecimal.ZERO)==0){
            return "0.00%";
        }
        BigDecimal a=new BigDecimal(num2.toString());
        BigDecimal b=new BigDecimal(num1.toString());
        BigDecimal middleNum = b.multiply(new BigDecimal(100));
        BigDecimal result = middleNum.divide(a,2,BigDecimal.ROUND_HALF_UP);
        return new StringBuilder().append(result).append("%").toString();
    }

    /**
     * 将字符串形式的金额转为分
     * @param str
     * @return
     */
    public static BigDecimal strToBig(String str){
        return new BigDecimal(str).multiply(new BigDecimal(100));
    }

    /**
     * 计算fp
     * @param gnsc 供能时长类型 0：7*24 1：7*10
     * @param cg 层高
     * @return
     */
    public static BigDecimal getFp(Integer gnsc,BigDecimal cg){
        BigDecimal fp;//最终价格
        BigDecimal type1=new BigDecimal("1200");//7*24
        BigDecimal type2=new BigDecimal("1000");//7*10
        BigDecimal sum=new BigDecimal(0);//计算价格
        BigDecimal price=new BigDecimal("1500");//比较值价格
        if(gnsc==1){
            sum=type1.multiply(cg.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_EVEN));
        }else if(gnsc==2){
            sum=type2.multiply(cg.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_EVEN));
        }
        if(sum.compareTo(price)>-1){
            fp=price;
        }else{
            fp=sum;
        }
        return fp;
    }
    /**
     * 商业供冷费用计算
     * @param mj 房屋面积
     * @param gnscs 供能时长
     * @param gnsc 供能时长类型 0：7*24 1：7*10
     * @param cg 层高
     * @param type1 7*24价格
     * @param type2 7*10价格
     * @return 总计金额
     */
    public static BigDecimal getMoney(BigDecimal mj,Double gnscs,Integer gnsc,BigDecimal cg,BigDecimal type1,BigDecimal type2){
        //1.计算fp
        BigDecimal fp;//最终价格
        BigDecimal sum=new BigDecimal(0);//计算价格
        BigDecimal price=new BigDecimal("1500");//比较值价格
        if(gnsc==0){
            sum=type1.multiply(cg.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_EVEN));
        }else if(gnsc==1){
            sum=type2.multiply(cg.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_EVEN));
        }
        if(sum.compareTo(price)>-1){
            fp=price;
        }else{
            fp=sum;
        }
        //2.计算总计
        //面积*供能时长*fp*(层高/3)
        BigDecimal a=cg.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_EVEN);
        BigDecimal money=mj.multiply(new BigDecimal(gnscs.toString())).multiply(fp).multiply(a).setScale(0, BigDecimal.ROUND_HALF_UP);
        return money;
    }

    /**
     * 计算非大客户供暖价格
     * @param mj 房屋面积
     * @param cg 层高
     * @param gnscs 供能持续时间
     * @param khlx 房屋类型 1:居民 2:公租房 3:商业 4:大客户
     * @param dygndj 地域供暖单价 0:西安 1:咸阳
     * @param hotBusineseRes 供热商业单价
     * @param hotXian 供热西安单价
     * @param hotXianYang 供热咸阳单价
     * @return
     */
    public static Map<String,BigDecimal> getMoney1(BigDecimal mj, BigDecimal cg, Double gnscs, Integer khlx, Integer dygndj, BigDecimal hotBusineseRes, BigDecimal hotXian, BigDecimal hotXianYang){
        Map<String,BigDecimal> m=new HashMap<>();
        BigDecimal area=null;
        BigDecimal money=new BigDecimal(0);
        if(khlx==1||khlx==2){//居民和公租房
            if(dygndj==0){//西安供热价格
                money=mj.multiply(new BigDecimal(gnscs)).multiply(hotXian).setScale(0, BigDecimal.ROUND_HALF_UP);
                area=hotXian;
            }else if(dygndj==1){//咸阳供热价格
                money=mj.multiply(new BigDecimal(gnscs)).multiply(hotXianYang).setScale(0, BigDecimal.ROUND_HALF_UP);
                area=hotXianYang;
            }
        }else if(khlx==3){//商业
            //计算（层高/3）
            BigDecimal a=cg.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_EVEN);
            area=hotBusineseRes;
            //总额
            money=mj.multiply(new BigDecimal(gnscs)).multiply(hotBusineseRes).multiply(a).setScale(0, BigDecimal.ROUND_HALF_UP);
        }
        m.put("area",area);
        m.put("sum",money);
        return m;
    }


}
